package com.wmm.fast.main.shop2Decorator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 写写画画 装饰模式
 * 每个装饰对象的实现与使用分离,每个装饰只关心自己的功能,不需要关心如何添加到使用链
 *
 * Component 是定义对象接口,可以动态给对象添加职责
 * ConcreteComponent是具体的职责对象,也可以给对象添加职责
 * Decorator继承自Component,从外类扩展Component功能,但外部无需知道Decorator的存在,
 * ConcreteDecorator 就是具体的装饰对象行为,起到给Component添加功能的职责
 * ConcreteComponent与Decorator实际上有一定的重复,可根据场景简化.,
 *
 * 场景: 当系统现有业务需要根据特定场合添加新功能时,就可以使用装饰模式
 * 有效的区分开装饰与核心职责,去除相关逻辑的重复代码.
 * 重点是要注意装饰顺序.避免业务流异常
 * @Auther: Token360
 * @Date: 2018/9/6 10:56
 * @Description:
 */
public class DecoratorExecute {

    private Logger log = LoggerFactory.getLogger(DecoratorExecute.class);

    public static void main(String[] args) {
        ConcreteComponent c1 = new ConcreteComponent();
        ConcreteDecoratorA a = new ConcreteDecoratorA();
        ConcreteDecoratorB b = new ConcreteDecoratorB();
        ConcreteDecoratorC c = new ConcreteDecoratorC();

        a.setComponent(c1);
        c.setComponent(a);
        b.setComponent(c);
        b.operation();
    }

}
